{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/tratamento-de-erros/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Tratamento de erros de condições e exceções\",\n  \"description\": \"Nesse artigo iremos abordar sobre como tratar de forma correta os erros de transações e condições no Solidity. Falaremos sobre `require`, `revert` e `assert` para tratar condições e `try / catch` para tratar exceções.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Iniciante\", \"Intermediário\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"17/05/2022\",\n  \"modifiedAt\": \"20220517\",\n  \"suburl\": \"tratamento-de-erros/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos abordar sobre como tratar de forma correta os erros de transa\\xE7\\xF5es e condi\\xE7\\xF5es no Solidity.\\nFalaremos sobre \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"require\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"revert\"), \" e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"assert\"), \" para tratar condi\\xE7\\xF5es e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"try / catch\"), \" para tratar exce\\xE7\\xF5es.\"), mdx(\"h2\", {\n    \"id\": \"tratando-erros-de-condições\"\n  }, \"Tratando erros de condi\\xE7\\xF5es\"), mdx(\"p\", null, \"Um erro desfar\\xE1 todas as altera\\xE7\\xF5es feitas no estado durante uma transa\\xE7\\xE3o.\\nVoc\\xEA pode lan\\xE7ar um erro chamando \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"require\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"revert\"), \" ou \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"assert\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"require\"), \" - \\xE9 usado para validar entradas e condi\\xE7\\xF5es antes da execu\\xE7\\xE3o\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"revert\"), \" - \\xE9 semelhante a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"require\"), \", por\\xE9m \\xE9 lan\\xE7ada dentro de uma condi\\xE7\\xE3o\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"assert\"), \" - \\xE9 usado para verificar um c\\xF3digo que nunca deve ser falso. Falha na asser\\xE7\\xE3o provavelmente significa que h\\xE1 um bug\"))), mdx(\"p\", null, \"Usar o erro personalizado pode gerar economias no custo de gas pois evita que um c\\xF3digo seja executado se n\\xE3o estiver de acordo com as condi\\xE7\\xF5es.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract Error {\\n    function testRequire(uint _i) public pure {\\n        // Require deve ser usado para validar condi\\xE7\\xF5es como:\\n        // - entradas\\n        // - condi\\xE7\\xF5es para execu\\xE7\\xE3o de uma determinada opera\\xE7\\xE3o\\n        // - retornar valores de chamadas para outras fun\\xE7\\xF5es\\n        require(_i > 10, \\\"Input must be greater than 10\\\"); \\n        // Ir\\xE1 retornar uma mensagem de erro se _i for menor ou igual a 10\\n        // Todo o c\\xF3digo abaixo do require n\\xE3o ser\\xE1 executado.\\n    }\\n\\n    function testRevert(uint _i) public pure {\\n        // Reverter \\xE9 \\xFAtil quando a condi\\xE7\\xE3o a ser verificada \\xE9 complexa.\\n        // Este c\\xF3digo faz exatamente a mesma coisa que o exemplo acima\\n        if (_i <= 10) {\\n            revert(\\\"Input must be greater than 10\\\");\\n        }\\n    }\\n\\n    uint public num;\\n\\n    function testAssert() public view {\\n        // Assert s\\xF3 deve ser usado para testar erros internos e verificar invariantes.\\n\\n        // Aqui afirmamos que num \\xE9 sempre igual a 0, \\n        // pois \\xE9 imposs\\xEDvel atualizar o valor de num\\n        assert(num == 0);\\n    }\\n\\n    // Erros personaliz\\xE1veis\\n    error InsufficientBalance(uint balance, uint withdrawAmount);\\n\\n    function testCustomError(uint _withdrawAmount) public view {\\n        uint bal = address(this).balance;\\n        if (bal < _withdrawAmount) {\\n            revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});\\n        }\\n    }\\n}\\n\")), mdx(\"p\", null, \"Aqui est\\xE1 outro exemplo simulando uma aplica\\xE7\\xE3o de carteira\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract Account {\\n    uint public balance;\\n    uint public constant MAX_UINT = 2**256 - 1;\\n\\n    function deposit(uint _amount) public {\\n        uint oldBalance = balance;\\n        uint newBalance = balance + _amount;\\n\\n        // balance + _amount n\\xE3o executa a fun\\xE7\\xE3o se balance + _amount >= balance\\n        require(newBalance >= oldBalance, \\\"Invalid new balance\\\");\\n\\n        balance = newBalance;\\n\\n        // Aqui afirmamos que o balance deve sempre ser maior ou igual ao oldBalance\\n        // ap\\xF3s a atualiza\\xE7\\xE3o da vari\\xE1vel balance\\n        assert(balance >= oldBalance);\\n    }\\n\\n    function withdraw(uint _amount) public {\\n        uint oldBalance = balance;\\n\\n        // balance - _amount n\\xE3o executa a fun\\xE7\\xE3o se balance >= _amount\\n        require(balance >= _amount, \\\"Balance insufficient\\\");\\n\\n        if (balance < _amount) {\\n            revert(\\\"Balance insufficient\\\");\\n        }\\n\\n        balance -= _amount;\\n\\n        // Aqui afirmamos que o balance deve sempre ser menor ou igual ao oldBalance\\n        // ap\\xF3s a atualiza\\xE7\\xE3o da vari\\xE1vel balance\\n        assert(balance <= oldBalance);\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"tratamento-de-exceções-trycatch-exceptions\"\n  }, \"Tratamento de exce\\xE7\\xF5es (Try/catch Exceptions)\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"try / catch\"), \" serve para detectar erros de chamadas de fun\\xE7\\xF5es externas e na cria\\xE7\\xE3o de contratos.\"), mdx(\"p\", null, \"Abaixo podemos analisar um exemplo onde o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"try / catch\"), \" se aplica\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n// External contract used for try / catch examples\\ncontract Foo {\\n    address public owner;\\n\\n    constructor(address _owner) {\\n        require(_owner != address(0), \\\"endere\\xE7o inv\\xE1lido 0\\\");\\n        assert(_owner != 0x0000000000000000000000000000000000000001);\\n        owner = _owner;\\n    }\\n\\n    function myFunc(uint x) public pure returns (string memory) {\\n        require(x != 0, \\\"require retornou false para valida\\xE7\\xE3o\\\");\\n        return \\\"myFunc chamada\\\";\\n    }\\n}\\n\\ncontract Bar {\\n    event Log(string message);\\n    event LogBytes(bytes data);\\n\\n    Foo public foo;\\n\\n    constructor() {\\n        // O contrato Foo \\xE9 usado por exemplo de try catch com chamada externa\\n        foo = new Foo(msg.sender);\\n    }\\n\\n    // Exemplo de try / catch com chamada externa\\n    // tryCatchExternalCall(0) => Log(\\\"external call failed\\\")\\n    // tryCatchExternalCall(1) => Log(\\\"my func was called\\\")\\n    function tryCatchExternalCall(uint _i) public {\\n        // Se nenhuma exce\\xE7\\xE3o for detectada, o c\\xF3digo emit Log ser\\xE1 executado\\n        try foo.myFunc(_i) returns (string memory result) {\\n            emit Log(result);\\n        } catch {\\n            // Se for detectado uma exce\\xE7\\xE3o (exception) um erro ser\\xE1 emitido\\n            emit Log(\\\"falha na chamada de fun\\xE7\\xE3o externa\\\");\\n        }\\n    }\\n\\n    // Exemplo de try / catch com a cria\\xE7\\xE3o do contrato\\n    // tryCatchNewContract(0x0000000000000000000000000000000000000000) => Log(\\\"invalid address\\\")\\n    // tryCatchNewContract(0x0000000000000000000000000000000000000001) => LogBytes(\\\"\\\")\\n    // tryCatchNewContract(0x0000000000000000000000000000000000000002) => Log(\\\"Foo created\\\")\\n    function tryCatchNewContract(address _owner) public {\\n        try new Foo(_owner) returns (Foo foo) {\\n            // Voc\\xEA pode usar a vari\\xE1vel foo aqui\\n            emit Log(\\\"Foo criado\\\");\\n        } catch Error(string memory reason) {\\n            // pegar uma falha do revert() e require()\\n            emit Log(reason);\\n        } catch (bytes memory reason) {\\n            // pegar uma falha do assert()\\n            emit LogBytes(reason);\\n        }\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Tratamento de erros de condições e exceções","description":"Nesse artigo iremos abordar sobre como tratar de forma correta os erros de transações e condições no Solidity. Falaremos sobre `require`, `revert` e `assert` para tratar condições e `try / catch` para tratar exceções.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAbKNAcYP/8QAGRAAAwEBAQAAAAAAAAAAAAAAAQIREgAE/9oACAEBAAEFAlM9D7Crc4Ghb3//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAdEAABAwUBAAAAAAAAAAAAAAABAAIRAxASMVFB/9oACAEBAAY/AiDUJc6YHESJceITtZerdv/EABkQAAMBAQEAAAAAAAAAAAAAAAABESExQf/aAAgBAQABPyGlIQ8QaMjxlGZiyNQ1MuP7C3TglFrp/9oADAMBAAIAAwAAABCgD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESFRMYFBYdH/2gAIAQEAAT8QG18DZzAnh+e4+Ztla7MYgwUqx6xKgcBItNXMFiduI1SPbP/Z","aspectRatio":1.5151515151515151,"src":"/static/4a8e0c0a498d5d44f5a8d1ad187ebf6d/0cb3d/capa.jpg","srcSet":"/static/4a8e0c0a498d5d44f5a8d1ad187ebf6d/f836f/capa.jpg 200w,\n/static/4a8e0c0a498d5d44f5a8d1ad187ebf6d/2244e/capa.jpg 400w,\n/static/4a8e0c0a498d5d44f5a8d1ad187ebf6d/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Iniciante","Intermediário"],"author":["Matheus"],"suburl":"tratamento-de-erros/","publishedAt":"17/05/2022","modifiedAt":"20220517"},"tableOfContents":{"items":[{"url":"#tratando-erros-de-condições","title":"Tratando erros de condições"},{"url":"#tratamento-de-exceções-trycatch-exceptions","title":"Tratamento de exceções (Try/catch Exceptions)","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"tratamento-de-erros/","postTopics":["Iniciante","Intermediário"],"publishedAt":"17/05/2022","prevArticle":{"title":"Funções e Modificadores","layout":"BlogPage","suburl":"funcoes/","author":["Matheus"],"tags":["Iniciante","Intermediário"],"publishedAt":"15/05/2022","modifiedAt":"20220515"},"nextArticle":{"title":"Evento, Construtor e Herança","layout":"BlogPage","suburl":"evento-construtor-heranca/","author":["Matheus"],"tags":["Iniciante","Intermediário"],"publishedAt":"18/05/2022","modifiedAt":"20220518"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}